void reverse(char* chars, int left, int right) {
    while (left < right) {
        char temp = chars[left];
        chars[left] = chars[right];
        chars[right] = temp;
        left++;
        right--;
    }
}

void reverseEachWord(char* s) {
    int n = strlen(s);
    int slow = 0, fast = 0;

    while (fast < n) {
        while (fast < n && s[fast] != ' ') fast++;
        reverse(s, slow, fast - 1);
        fast++;
        slow = fast;
    }
}

// 删除字符串中所有的空字符，但是单词之间需要一个空字符隔开
// 时间复杂度：O(n)
// 空间复杂度：O(1)，原地删除空字符
char* trim(char* s) {
    int n = strlen(s);
    int slow = 0, fast = 0;

    while (fast < n) {
        if (s[fast] != ' ' || (fast >= 1 && s[fast - 1] != ' ')) {
            s[slow] = s[fast];
            slow++;
        }
        fast++;
    }

    if (slow >= 1 && s[slow - 1] == ' ') slow--;
    s[slow] = '\0';

    // `strdup()` 函数将字符数组复制到新的内存区域中，并返回该内存区域的指针，以便调用者可以使用该指针来访问新的字符串
    return strdup(s);
}

char* reverseWords(char* s) {
    s = trim(s);
    reverse(s, 0, strlen(s) - 1);
    reverseEachWord(s);
    return s;
}